1
Парадокс производительности: почему правильный код медленен
AI023Lesson 6
00:00

Парадокс производительности указывает, что математически идеальный ядро, например $out = x + y$, может на самом деле работать хуже, чем цикл на процессоре, если не удается распределить постоянные затраты аппаратного обеспечения видеопроцессора. Это часто проявляется как налог за запуск.

1. Ошибка «Правильности»

Функциональная корректность не является показателем эффективности. Хотя ваш код на Triton может правильно распределять работу между тысячами потоков, если общее количество работы (N) невелико, видеопроцессор остается недогруженным. Аппаратное обеспечение тратит больше времени на переходы состояний, чем на реальные арифметические операции.

2. Ловушка измерений в Python

Измерение производительности кода для видеопроцессора с помощью Python с использованием time.time() опасно. Вызовы видеопроцессора являются асинхронными; Python просто ставит в очередь команду и продолжает работу. Без torch.cuda.synchronize(), вы измеряете время постановки в очередь. При синхронизации вы измеряете задержку передачи данных с хоста на устройство, которая часто в 10 раз дольше самой выполнения ядра.

Накладные расходы Python/драйвера (налог за запуск)ЯдроВремя (мс)

3. Задержка против пропускной способности

Чтобы преодолеть парадокс, необходимо предоставить достаточный объем работы, чтобы «скрыть» задержку запуска. Это переход от режима ограниченного задержкой режима (ограниченного шиной процессор-видеопроцессор) к режиму ограниченному пропускной способности режима (ограниченному памятью или вычислительной мощностью видеопроцессора).

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>